package com.malou.client.seguridad.menu;

import java.util.List;

import com.extjs.gxt.ui.client.data.TreeLoader;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.malou.client.MalouConstants;
import com.malou.client.util.MensajeData;

public class Menus {
	
	private static MenuServiceAsync ms = GWT.create(MenuService.class);
	public static TreeLoader<MenuOpciones> loader;
	public static TreeStore<MenuOpciones> store;
	private static Integer menu_id;
	public static MenuDialog menuDialog;
	public static MenuPanel menuPanel;	
	
	public static Integer usuario_id;
	public static Integer tipo;
	public static boolean carga;
	
	public static MenuLateral menuLateral;
	public static TreeStore<MenuOpciones> storeLateral;

	
	private static MalouConstants constants = GWT.create(MalouConstants.class);
	
	/*public static void list(){
		RpcProxy<MenuOpciones> proxy = new RpcProxy<MenuOpciones>() {        
			@Override
	        public void load(Object loadConfig, AsyncCallback<MenuOpciones> callback) {
	          ms.getMenu((MenuOpciones) loadConfig, usuario_id, tipo, callback);				
	        }
	      };    
	    
	    TreeModelReader<List<MenuOpciones>> reader = new TreeModelReader<List<MenuOpciones>>();
	    
	    
	      loader = new BaseTreeLoader<MenuOpciones>(proxy,reader){
	    	  @Override
	    	  public boolean hasChildren(MenuOpciones parent) {
	    		  
	    	    return parent.get("haschildren") != null;
	    	  }
	      };
	      
	      loader.addLoadListener(new LoadListener() {
		    	 
		    	 public void loaderLoad(LoadEvent le) {
		    		 
		    		 if(menuPanel.tree.isCheckable()){
		    			 if(carga){
		    				 menuPanel.guardarPermiso.setEnabled(true);
		    				 //menuPanel.tree.expandAll();
		    				 //menuPanel.tree.e
		    				 carga = false;
		    			 }
		    			 //System.out.println("exp");
		    		 }
		    	 }
		      });
	    
	    store = new TreeStore<MenuOpciones>(loader);
	    
	    store.setKeyProvider(new ModelKeyProvider<MenuOpciones>() {  
	      public String getKey(MenuOpciones model) {  
	         return "node_" + model.get("id");  
	      }  
	    }); 
	}*/
	
	public static void save(MenuOpciones mnu) {
		menu_id = mnu.getId();
		
		if(mnu.getParametro() == null)
			mnu.setParametro("");
		
		ms.save(mnu, new AsyncCallback<MensajeData>() {

			@Override
			public void onFailure(Throwable caught) {				
				MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);	
				store.rejectChanges();
			}

			@Override
			public void onSuccess(MensajeData data) {
				if (data.guardado) {					
					menuDialog.hide();
					if(menu_id != null){
						store.commitChanges();
					}else{						 
						//loader.load();
						getMenusArray();
					}
					
				}
				 else {
					 menuDialog.status.hide();
					 menuDialog.getButtonBar().enable();
					 String msg;					
					 if(data.errorTipo == 1)
						 msg = constants.menuYaExiste();
					 else if(data.errorTipo == 2)
						 msg = constants.menuYaExisteParametro();
					 else if(data.errorTipo == 3)
						 msg = constants.menuYaExisteParametroOperacionNivel();
					 else
						 msg = constants.menuNoGuardado();
					 MessageBox.alert(constants.sistemaMarcocruzado(), msg, null);
				}						
			}
			
		});
	}
	
	public static void delete(Integer id) {
		  
		  ms.delete(id, new AsyncCallback<MensajeData>() {

				@Override
				public void onFailure(Throwable caught) {					
					MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);					
				}

				@Override
				public void onSuccess(MensajeData data) {
					if (data.guardado) {												
						//loader.load();
						getMenusArray();
					}
					 else {						 					 
						 MessageBox.alert(constants.sistemaMarcocruzado(), constants.menuNoEliminado(), null);
					}						
				}
				
			});
	}
	
	public static void getMenusArray(){
		menuPanel.vp.mask(constants.cargando());
		
		ms.getMenusArray(usuario_id, tipo, new AsyncCallback<List<MenuOpciones>>() {

			@Override
			public void onFailure(Throwable caught) {					
				MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);
				menuPanel.vp.unmask();
				menuPanel.guardarPermiso.setEnabled(true);
			}

			@Override
			public void onSuccess(List<MenuOpciones> mnu) {
				store.removeAll();
				store.add(mnu, true);
				if(menuPanel.tree.isCheckable()){	    			 
	    			menuPanel.guardarPermiso.setEnabled(true);
	    			menuPanel.fireBehavior = false;
	    			menuPanel.checkPermitidos();
	    			//menuPanel.tree.expandAll();
	    			menuPanel.guardarPermiso.setEnabled(true);
	    		 }
				menuPanel.vp.unmask();				
			}
			
		});
	}
	
	public static void savePermisos(List<Integer> updateToPermited, List<Integer> insertToPermited, List<Integer> updateIfExistElseInsertToNoPermited){
		menuPanel.vp.mask(constants.cargando());
		ms.savePermisos(usuario_id, tipo, updateToPermited, insertToPermited, updateIfExistElseInsertToNoPermited, new AsyncCallback<MensajeData>() {

			@Override
			public void onFailure(Throwable caught) {					
				MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);
				menuPanel.vp.unmask();
				menuPanel.guardarPermiso.setEnabled(true);
			}

			@Override
			public void onSuccess(MensajeData data) {
				if (data.guardado) {											
					//System.out.println("permiso guardado");
					getMenusArray();
				}
				 else {						 					 
					 MessageBox.alert(constants.sistemaMarcocruzado(), constants.menuPermisoNoGuardado(), null);
				}
			}
			
		});
	}
	
	public static void getMenusPermitidos(Integer usuario_logueado_id){
		menuLateral.mask(constants.cargando());
		
		ms.getMenusPermitidos(usuario_logueado_id, new AsyncCallback<List<MenuOpciones>>() {

			@Override
			public void onFailure(Throwable caught) {					
				MessageBox.alert(constants.sistemaMarcocruzado(), constants.errorConexion(), null);
				menuLateral.unmask();
			}

			@Override
			public void onSuccess(List<MenuOpciones> mnu) {
				storeLateral.removeAll();
				storeLateral.add(mnu, true);				
				menuLateral.unmask();				
			}
			
		});
	}
}
